<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>su 和 sudo 命令的区别 | 失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		<article>
	
		<h1>su 和 sudo 命令的区别</h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<h2 id="使用-su-命令临时切换用户身份"><a href="#使用-su-命令临时切换用户身份" class="headerlink" title="使用 su 命令临时切换用户身份"></a>使用 su 命令临时切换用户身份</h2><h3 id="一、su-的适用条件和威力"><a href="#一、su-的适用条件和威力" class="headerlink" title="一、su 的适用条件和威力"></a>一、su 的适用条件和威力</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;su 命令就是切换用户的工具。比如以普通用户 beinan 登录的，但要田间用户任务，执行 useradd ，beinan 用户没有这个权限，而这个权限由 root 所拥有。解决办法只有两个：</p>
<ol>
<li>退出 beinan 用户，重新以 root 用户登录，但这种办法并不是最好的；</li>
<li>没有必要退出 beinan 用户，可以用 su 来切换到 root 下进行条件用户的工作，等任务完成后再退出 root 。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以看到，通过 su 切换是一种比较好的办法。    </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通过 su 可以在用户之间切换，如果超级权限用户 root 向普通或虚拟用户切换不需要密码，而普通用户切换到其他任何用户都需要密码验证。</p>
<h3 id="二、su-的用法："><a href="#二、su-的用法：" class="headerlink" title="二、su 的用法："></a>二、su 的用法：</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">su [OPTION选项参数] [用户]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;- ，-l ， –login 登录并改变到所切换的用户环境；      </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-c ，–command=COMMAND 执行一个命令，然后退出所切换到的用户环境；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;更多帮助，参考:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">man su</div></pre></td></tr></table></figure>
<h3 id="三、su-的范例："><a href="#三、su-的范例：" class="headerlink" title="三、su 的范例："></a>三、su 的范例：</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;su 在不加任何参数，默认为切换到 root 用户，但没有转到 root 用户家目录下，也就是说这时虽然是切换为 root 用户了，但并没有改变 root 登录环境；用户默认的登录环境，可以在 /etc/passwd 中查看，包括家目录， SHELL 定义等；</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ su</div><div class="line">Password:</div><div class="line">[root@localhost beinan]# pwd</div><div class="line">/home/beinan</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;su 加参数 - ，表示默认切换到 root 用户，并且改变到 root 用户的环境变量；</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ pwd</div><div class="line">/home/beinan</div><div class="line">[beinan@localhost ~]?$ su -</div><div class="line">Password:</div><div class="line">[root@localhost ~]# pwd</div><div class="line">/root</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;su 参数 - 用户名</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ su - root 注：这个和su - 是一样的功能；</div><div class="line">Password:</div><div class="line">[root@localhost ~]# pwd</div><div class="line">/root</div><div class="line">[beinan@localhost ~]?$ su - linuxsir 注：这是切换到 linuxsir用户</div><div class="line">Password: 注：在这里输入密码；</div><div class="line">[linuxsir@localhost ~]?$ pwd 注：查看用户当前所处的位置；</div><div class="line">/home/linuxsir</div><div class="line">[linuxsir@localhost ~]?$ id 注：查看用户的UID和GID信息，主要是看是否切换过来了；</div><div class="line">uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir)</div><div class="line">[linuxsir@localhost ~]?$</div><div class="line">[beinan@localhost ~]?$ su - -c ls 注：这是su的参数组合，表示切换到root用户，并且改变到root环境，然后列出root家目录的文件，然后退出root用户；</div><div class="line">Password: 注：在这里输入root的密码；</div><div class="line">anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot</div><div class="line">[beinan@localhost ~]?$ pwd 注：查看当前用户所处的位置；</div><div class="line">/home/beinan</div><div class="line">[beinan@localhost ~]?$ id 注：查看当前用户信息；</div><div class="line">uid=500(beinan) gid=500(beinan) groups=500(beinan)</div></pre></td></tr></table></figure>
<h3 id="四、su-的优缺点"><a href="#四、su-的优缺点" class="headerlink" title="四、su 的优缺点"></a>四、su 的优缺点</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;su 的确为管理带来方便，通过切换到 root 下，能完成所有系统管理工具，只要把 root 的密码交给任何一个普通用户，它都能切换到 root 来完成所有的系统管理工作；但通过 su 切换到 root 后，也有不安全因素；比如系统有10个用户，而且都参与管理。如果这10个用户都涉及到超级权限的运用，作为管理员如果想让其他用户通过 su 来切换到 超级权限的 root ，必须把 root 权限密码都告诉这10个用户、如果这10个用户都有 root 权限，通过 root 权限可以做任何事，这在一定程度上就对系统的安全造成了威胁，简直是噩梦；“没有不安全的系统，只有不安全的人” ，绝对不能保证这10个用户都能按正常操作流程来管理系统，其中任何一个人对系统操作的重大失误，都可能导致系统崩溃或数据丢失；所以 su 工具在多人参与的系统管理中，并不hi是最好的选择，su 只适合于一两个人参与管理的系统，毕竟 su 并不能让普通用户受限的使用；超级用户 root 密码应该掌握在少数用户手中，这绝对是真理！所以集权而治的存在是有一定道理的。</p>
<h2 id="sudo-授权许可使用的-su-，也是受限制的-su"><a href="#sudo-授权许可使用的-su-，也是受限制的-su" class="headerlink" title="sudo 授权许可使用的 su ，也是受限制的 su"></a>sudo 授权许可使用的 su ，也是受限制的 su</h2><h3 id="一、sudo-的适用条件"><a href="#一、sudo-的适用条件" class="headerlink" title="一、sudo 的适用条件"></a>一、sudo 的适用条件</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;由于su 对切换到超级权限用户root后，权限的无限制性，所以su并不能担任多个管理员所管理的系统。如果用su 来切换到超级用户来管理系统，也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时，最好是针对每个管理员的技术特长和管理范围，并且有针对性的下放给权限，并且约定其使用哪些工具来完成与其相关的工作，这时我们就有必要用到 sudo。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通过sudo，我们能把某些超级权限有针对性的下放，并且不需要普通用户知道root密码，所以sudo 相对于权限无限制性的su来说，还是比较安全的，所以sudo 也能被称为受限制的su ；另外sudo 是需要授权许可的，所以也被称为授权许可的su；<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sudo 执行命令的流程是当前用户切换到root（或其它指定切换到的用户），然后以root（或其它指定的切换到的用户）身份执行命令，执行完成后，直接退回到当前用户；而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权；<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如我们想用beinan普通用户通过more /etc/shadow文件的内容时，可能会出现下面的情况；</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ more /etc/shadow</div><div class="line">/etc/shadow: 权限不够</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这时我们可以用sudo more /etc/shadow 来读取文件的内容；就就需要在/etc/soduers中给beinan授权<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;于是我们就可以先su 到root用户下通过visudo 来改/etc/sudoers ；（比如我们是以beinan用户登录系统的）</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ su</div><div class="line">Password: 注：在这里输入root密码</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面运行 visudo</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost beinan]<span class="comment"># visudo 注：运行visudo 来改 /etc/sudoers</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入如下一行，退出保存；退出保存，在这里要会用vi，visudo也是用的vi编辑器；至于vi的用法不多说了；beinan ALL=/bin/more 表示beinan可以切换到root下执行more 来查看文件；<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;退回到beinan用户下，用exit命令；</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost beinan]<span class="comment"># exit</span></div><div class="line"><span class="built_in">exit</span></div><div class="line">[beinan@localhost ~]?$</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看beinan的通过sudo能执行哪些命令？</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ sudo -l</div><div class="line">Password: 注：在这里输入beinan用户的密码</div><div class="line">User beinan may run the following commands on this host: 注：在这里清晰的说明在本台主机上，beinan用户可以以root权限运行more ；在root权限下的more ，可以查看任何文本文件的内容的；</div><div class="line">(root) /bin/more</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后，我们看看是不是beinan用户有能力看到/etc/shadow文件的内容；   </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ sudo more /etc/shadow</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;beinan 不但能看到 /etc/shadow文件的内容，还能看到只有root权限下才能看到的其它文件的内容，比如；  </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ sudo more /etc/gshadow</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于beinan用户查看和读取所有系统文件中，我只想把/etc/shadow 的内容可以让他查看；可以加入下面的一行；</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">beinan ALL=/bin/more /etc/shadow</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;题外话：有的弟兄会说，我通过su 切换到root用户就能看到所有想看的内容了，哈哈，对啊。但咱们现在不是在讲述sudo的用法吗？如果主机上有多个用户并且不知道root用户的密码，但又想查看某些他们看不到的文件，这时就需要管理员授权了；这就是sudo的好处；      </p>
<h4 id="实例：练习用户组在-etc-sudoers中写法；"><a href="#实例：练习用户组在-etc-sudoers中写法；" class="headerlink" title="实例：练习用户组在/etc/sudoers中写法；"></a>实例：练习用户组在/etc/sudoers中写法；</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果用户组出现在/etc/sudoers 中，前面要加%号，比如%beinan ，中间不能有空格；%beinan ALL=/usr/sbin/*,/sbin/*<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果我们在 /etc/sudoers 中加上如上一行，表示beinan用户组下的所有成员，在所有可能的出现的主机名下，都能切换到root用户下运行 /usr/sbin和/sbin目录下的所有命令；      </p>
<h4 id="实例：练习取消某类程序的执行："><a href="#实例：练习取消某类程序的执行：" class="headerlink" title="实例：练习取消某类程序的执行："></a>实例：练习取消某类程序的执行：</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;取消程序某类程序的执行，要在命令动作前面加上!号； 在本例中也出现了通配符的*的用法；</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注：把这行规则加入到/etc/sudoers中；但您得有beinan这个用户组，并且beinan也是这个组中的才行；</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;本规则表示beinan用户在所有可能存在的主机名的主机上运行/usr/sbin和/sbin下所有的程序，但fdisk 程序除外；</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[beinan@localhost ~]?$ sudo -l</div><div class="line">Password: 注：在这里输入beinan用户的密码；</div><div class="line">User beinan may run the following commands on this host:(root) /usr/sbin/*(root) /sbin/*(root) !/sbin/fdisk</div><div class="line">[beinan@localhost ~]?$ sudo /sbin/fdisk -l</div><div class="line">Sorry, user beinan is not allowed to execute <span class="string">'/sbin/fdisk -l'</span> as root on localhost.</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注：不能切换到root用户下运行fdisk 程序；<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果有sudo 的权限而没有su的权限: sudo su;</p>

	

	
		<span class="different-posts"><a href="/2017/10/12/1. Linux 基础/14. Linux su 和 sudo 命令的区别/" onclick="window.history.go(-1); return false;">⬅️ Go back </a></span>

	

</article>

	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
